#ifndef __DRV_BTN_H
#define __DRV_BTN_H

#include <stdint.h>

#define DRV_TIME_BASE 10
#define DRV_CLICK_LIMIT (1000 / DRV_TIME_BASE)
#define DRV_PRESS_FILTER 5
#define DRV_POP_FILTER 5

typedef enum {
	DRV_BTN_STATE_IDLE = 0,
	DRV_BTN_STATE_IDLE_CHECK,
	DRV_BTN_STATE_PRESS_CHECK,
	DRV_BTN_STATE_PRESSED,
	DRV_BTN_STATE_POP_CHECK,
	DRV_BTN_STATE_EXCEED,
	DRV_BTN_STATE_MAX,
}DRV_BTN_STATE_E;

typedef enum {
    DRV_BTN_RET_CLICK,
	DRV_BTN_RET_PRESS,
	DRV_BTN_RET_MAX,
}DRV_BTN_RET_E;

typedef struct {
	DRV_BTN_RET_E ret;
	uint8_t cnt;//根据ret判断此字段的含义，click：点击次数，press：长按秒数
}DRV_BTN_RET_S;

typedef struct {
    uint8_t btnno;//按键编号
	uint8_t state;//状态机	
	uint8_t pressfilter;//触发滤波值
	uint8_t popfilter;//松开滤波值
	uint16_t clickcnt;//点击次数
	uint16_t idlecnt;//空闲次数
	uint16_t filtercnt;//状态变化当前滤波值	
	uint16_t presstime;//持续触发时间
	uint16_t maxpresstime;//最大触发时间，超过次时间产生事件并触发回调函数，且不再累计出发时间
	uint8_t (*querystate)(uint8_t);//获取按键状态，1：触发，0：未触发
	void (*retcallback)(uint8_t, DRV_BTN_RET_S);//产生事件时回调函数
}DRV_BTN_S;

#endif
